package bo;

import dao.UsuarioGrupoAcaoDAO;
import dao.UsuarioGrupoDAO;
import java.util.ArrayList;
import java.util.List;
import model.UsuarioGrupo;
import model.UsuarioGrupoAcao;
import util.CustomException;

/**
 *
 * @author rodolpho
 */
public class UsuarioGrupoBO extends AbstractBO {

    private UsuarioGrupoDAO usuarioGrupoDAO = new UsuarioGrupoDAO();
    private UsuarioGrupoAcaoDAO usuarioGrupoAcaoDAO = new UsuarioGrupoAcaoDAO();

    public List<UsuarioGrupo> selecionarTodos() throws CustomException {
        List<UsuarioGrupo> usuarioGrupoList = new ArrayList();
        try {
            beginTransaction();
            usuarioGrupoList = usuarioGrupoDAO.selecionarListaPorCriterio(getSession());
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
        return usuarioGrupoList;
    }

    public boolean possuiUsuarios(long ugrCodigo) throws CustomException {
        boolean result = false;
        try {
            beginTransaction();
            result = usuarioGrupoDAO.possuiUsuarios(getSession(), ugrCodigo);
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
        return result;
    }

    public UsuarioGrupo selecionarPorId(Long usuCodigo) throws CustomException {
        UsuarioGrupo usuarioGrupo = null;
        try {
            beginTransaction();
            usuarioGrupo = usuarioGrupoDAO.selecionarPorId(getSession(), usuCodigo);
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
        return usuarioGrupo;
    }

    public List<UsuarioGrupoAcao> selecionarAcoesPorUsuarioGrupo(UsuarioGrupo usuarioGrupo) throws CustomException {
        List<UsuarioGrupoAcao> usuarioGrupoAcaoList = new ArrayList();
        try {
            beginTransaction();
            usuarioGrupoAcaoList = usuarioGrupoAcaoDAO.selecionarPorUsuarioGrupo(getSession(), usuarioGrupo);
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
        return usuarioGrupoAcaoList;
    }

    public List<UsuarioGrupoAcao> selecionarAcoesPorNovoUsuarioGrupo(UsuarioGrupo usuarioGrupo) throws CustomException {
        List<UsuarioGrupoAcao> usuarioGrupoAcaoList = new ArrayList();
        try {
            beginTransaction();
            usuarioGrupoAcaoList = usuarioGrupoAcaoDAO.selecionarPorNovoUsuarioGrupo(getSession(), usuarioGrupo);
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
        return usuarioGrupoAcaoList;
    }

    public void salvar(UsuarioGrupo usuarioGrupo) throws CustomException {
        try {
            beginTransaction();
            if (usuarioGrupo.getUgrCodigo() == 0) {
                usuarioGrupo.setUgrCodigo(usuarioGrupoDAO.selecionarProximoId(getSession()));
            }
            usuarioGrupoDAO.salvar(getSession(), usuarioGrupo);
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
    }

    public void salvar(UsuarioGrupo usuarioGrupo, List<UsuarioGrupoAcao> usuarioGrupoAcoes) throws CustomException {
        try {
            beginTransaction();
            if (usuarioGrupo.getUgrCodigo() == 0) {
                // Obtendo o novo valor da sequence
                usuarioGrupo.setUgrCodigo(usuarioGrupoDAO.selecionarProximoId(getSession()));
            } else {
                // Excluindo as permissões antigas
                usuarioGrupoDAO.excluirPermissoes(getSession(), usuarioGrupo);
            }

            // Salvando o grupo
            usuarioGrupoDAO.salvar(getSession(), usuarioGrupo);
            // Salvando as permissões novas
            for (UsuarioGrupoAcao usuarioGrupoAcao : usuarioGrupoAcoes) {
                usuarioGrupoAcao.setUsuarioGrupo(usuarioGrupo);
                usuarioGrupoAcao.setUgaCodigo(usuarioGrupoAcaoDAO.selecionarProximoId(getSession()));
                usuarioGrupoAcaoDAO.salvar(getSession(), usuarioGrupoAcao);
            }
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
    }

    public void excluir(UsuarioGrupo usuarioGrupo) throws CustomException {
        try {
            beginTransaction();
            // Excluindo permissões
            usuarioGrupoDAO.excluirPermissoes(getSession(), usuarioGrupo);
            // Excluindo grupo
            usuarioGrupoDAO.excluir(getSession(), usuarioGrupo);
            commitTransaction();
        } catch (CustomException e) {
            rollbackTransaction();
            throw e;
        }
    }
}
